using System;
using System.Collections;
using System.Collections.Generic;
using METODESA.Server.Data.Exceptions;
using METODESA.Server.Data.METODESA.Entity;
using NHibernate;
using NHibernate.Expression;

namespace METODESA.Server.Data.METODESA.Nhibernate
{
    public class CompraDao : BaseDao
    {
        public static IList<OrdenCompra> getAllCompras(string type)
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                ICriteria myCriteria = myISession.CreateCriteria(typeof (OrdenCompra));
                if (type!=null && type!="all")
                    myCriteria.Add(Expression.Eq("Estado", int.Parse(type)));
                IList<OrdenCompra> compras = myCriteria.List<OrdenCompra>();
                return compras;
            }
            catch (Exception e)
            {
                throw new CompraNotExistsException("There's no compra");
                return null;
            }
        }

        public static IList<OrdenCompra> getCompraByCodigo(string search, string type)
        {

            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                ICriteria myCriteria = myISession.CreateCriteria(typeof(OrdenCompra));
                if (type!=null && type!="all")
                    myCriteria.Add(Expression.Eq("Estado", int.Parse(type)));
                myCriteria.Add(Expression.Eq("id", int.Parse(search)));
                IList<OrdenCompra> compras = myCriteria.List<OrdenCompra>();
                return compras;
            }
            catch (Exception e)
            {
                throw new CompraNotExistsException("There's no compra with the provided codigo");
                return null;
            }
        }

        public static IList<OrdenCompra> getCompraByFecha(string search, string type)
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                ICriteria myCriteria = myISession.CreateCriteria(typeof (OrdenCompra));
                if (type!=null && type!="all")
                    myCriteria.Add(Expression.Eq("Estado", int.Parse(type)));
                myCriteria.Add(Expression.Like("Fecha",'%'+search+'%'));
                IList<OrdenCompra> compras = myCriteria.List<OrdenCompra>();
                return compras;
            }

            catch (Exception e)
            {
                throw new CompraNotExistsException("There's no compra with the provided fecha");
                return null;
            }
        }

        public static IList<OrdenCompra> getCompraByEmpleado(string search,string type)
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                ICriteria myCriteria = myISession.CreateCriteria(typeof(OrdenCompra));
                if (type!=null && type!="all")
                    myCriteria.Add(Expression.Eq("Estado", int.Parse(type)));
                IList<OrdenCompra> compras = myCriteria.List<OrdenCompra>();
                IList<OrdenCompra> resultado = new List<OrdenCompra>();


                foreach (OrdenCompra compra in compras)
                {
                    string nombre = compra.Empleado.Nombre + " " + compra.Empleado.Apellido;
                    if (nombre.Contains(search))
                    {
                        resultado.Add(compra);
                    }

                }
                return resultado;
            }
            catch (Exception e)
            {
                throw new CompraNotExistsException("There's no compra with the provided empleado");
                return null;
            }
        }

        public static IList<OrdenCompra> getCompraByProveedor(string search, string type)
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                ICriteria myCriteria = myISession.CreateCriteria(typeof(OrdenCompra));
                if (type!=null && type!="all")
                    myCriteria.Add(Expression.Eq("Estado", int.Parse(type)));
                IList<OrdenCompra> compras = myCriteria.List<OrdenCompra>();
                IList<OrdenCompra> resultado=new List<OrdenCompra>();


                foreach (OrdenCompra compra in compras)
                {
                    if(compra.Proveedor.Nombre.Contains(search))
                    {
                        resultado.Add(compra);
                    }
                    
                }
                return resultado;
            }
            catch (Exception e)
            {
                throw new CompraNotExistsException("There's no compra with the provided proveedor");
                return null;
            }
        }

        public static OrdenCompra getCompraById(int id)
        {
          
       
            OrdenCompra compra = null;
            Boolean flag = true;

            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                compra = (OrdenCompra)myISession.Load(typeof(OrdenCompra), id);
                flag = false;
            }
            catch (HibernateException e)
            {
                throw new CompraNotExistsException("There's no compra with the provided id");

            }

            if (flag)
            {
                //throw new EntityNotExistsException("There's no client with the provided id");
                return null;
            }

            return compra;
      
        }

       
    }
}